package br.unifor.bd.deadlock;

import br.unifor.bd.protocol.TipoDeOperacao;
import br.unifor.bd.protocol.Transacao;

public class Lock {

	private TipoDeOperacao tipoDeOperacao;

	private Character alvo;

	private final Transacao transacao;

	private boolean converted = false;

	public Lock(TipoDeOperacao tipoDeOperacao, Transacao transacao, char target) {
		this.tipoDeOperacao = tipoDeOperacao;
		this.transacao = transacao;
		this.alvo = target;
	}

	public Character getAlvo() {
		return alvo;
	}

	public void setAlvo(Character alvo) {
		this.alvo = alvo;
	}

	public TipoDeOperacao getTipoDeOperacao() {
		return tipoDeOperacao;
	}

	public Transacao getTransacao() {
		return transacao;
	}

	public void setConverted(boolean converted) {
		this.converted = converted;
	}

	public void convertToCertify() {
		System.out.println("** Convertendo " + toString()
				+ " para CERTIFY LOCK");
		tipoDeOperacao = TipoDeOperacao.CERTIFY;
		converted = true;
	}

	public boolean isConverted() {
		return converted;
	}

	public String toString() {
		switch (tipoDeOperacao) {
		case READ:
			return "READ-LOCK" + transacao.getId() + "" + alvo;

		case WRITE:
			return "WRITE-LOCK" + transacao.getId() + "" + alvo;

		case CERTIFY:
			return "CERTIFY-LOCK" + transacao.getId() + "" + alvo;

		default:
			return "[Nao reconhecido]";
		}
	}

}
